package com.qupai.lib_base.utils

import android.os.Environment
import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.ThreadUtils
import com.blankj.utilcode.util.ThreadUtils.Task
import com.blankj.utilcode.util.Utils
import com.qupai.lib_base.exfun.log
import com.tencent.mmkv.MMKV
import java.io.File
import java.util.Arrays

object DeletePhotoUtils {

    interface DeleteResult {
        fun onFinish()
    }

    fun deleteOldestPhotos(saveCount: Int, listener: DeleteResult) {
        val parentFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
            .toString() + File.separator + Utils.getApp().packageName
        deleteOldestPhotos(parentFile, saveCount, listener)
    }

    /**
     * @param path 删除的文件路径
     * @param saveCount 保存的文件数量，操作路径下超出这个文件数量的其他文件都会被清理，按照保存时间排序删除
     * @param listener 删除回调监听
     */
    fun deleteOldestPhotos(path: String, saveCount: Int, listener: DeleteResult) {
        GlobalThreadPools.getInstance().execute {
            runCatching {
                val file = File(path)
                if (!file.exists()) {
                    //删除的文件目录不存在
                    LogUtils.e("删除的文件目录不存在")
                    listener.onFinish()
                    return@execute
                }
                val files = file.listFiles()
                if (files == null || files.isEmpty()) {
                    //删除的文件目录不存在
                    LogUtils.e("目录中没有可文件")
                    listener.onFinish()
                    return@execute
                }

                if (files.size <= saveCount) {
                    LogUtils.e("文件数量未达到 $saveCount 无需删除")
                    listener.onFinish()
                    return@execute
                }
                val delCount = files.size - saveCount
                LogUtils.e("即将删除 $delCount 个文件")

                // 根据最后修改时间排序（最早的文件排在最前面）
                Arrays.sort(files, Comparator.comparingLong(File::lastModified))

                for (index in 0 until delCount) {
                    if (files[index].delete()) {
//                        LogUtils.e("文件删除成功 ${files[index].absolutePath}")
                    } else {
//                        LogUtils.e("文件删除失败 ${files[index].absolutePath}")
                    }
                }
            }.onFailure {
                LogUtils.e("文件清理发生异常", it)
            }

        }

    }


    fun deletePhotos() {
        val parentFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString() + File.separator + Utils.getApp().packageName
        deletePhotos(parentFile)
    }
    fun deletePhotos(path:String) {
        val saveDays = MMKV.defaultMMKV(MMKV.MULTI_PROCESS_MODE, null).decodeInt("photoSaveDays", 3)
        LogUtils.i("照片保留天数：$saveDays")
        if (saveDays <= 0) {
            return
        }
        val directory = File(path)

        val currentTime = System.currentTimeMillis()
        val thresholdTime = currentTime - saveDays * 24 * 60 * 60 * 1000 // 转换为毫秒
        GlobalThreadPools.getInstance().execute {
            try {

                var totalFiles = 0
                var deletedFiles = 0
                var failedDeletes = 0
                var retainedFiles = 0

                directory.listFiles()?.forEach { file ->
                    if (file.isFile) {
                        totalFiles++
                        if (file.lastModified() < thresholdTime) {
                            if (file.delete()) {
                                deletedFiles++
                            } else {
                                failedDeletes++
                            }
                        } else {
                            retainedFiles++
                        }
                    }
                }
                // 打印统计信息
                LogUtils.d("总文件数: $totalFiles")
                LogUtils.d("已删除文件数: $deletedFiles")
                LogUtils.d("删除失败数: $failedDeletes")
                LogUtils.d("保留文件数: $retainedFiles")
            } catch (e: Exception) {
                LogUtils.e("文件清理发生异常", e)
            }
        }

    }

}